package com.example.demo.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * @program: demo
 * @description: 日期工具类
 * @author: wangze
 * @create: 2020-05-28 21:05
 **/
public class DateUtil {
    // 默认日期格式
    public static String DEFAULT_FORMAT = "yyyy-MM-dd";

//    public static void main(String[] args){
//        System.out.println(getCurrYearFirst());
//        System.out.println(getCurrYearLast());
//        System.out.println(getYearFirst(2015));
//        System.out.println(getYearLast(2015));
//        System.out.println(getFirstDay(2020,2));
//        System.out.println(getLastDay(2020,2));
//        System.out.println(isInMonth(new Date(),getFirstDay(2020,4),getLastDay(2020, 4)));
//    }
    /**
     * @Description: 格式化日期
     * @param date 日期对象
     * @return String 日期字符串
     * @Author: wangze
     */
    public static String formatDate(Date date){
        SimpleDateFormat f = new SimpleDateFormat(DEFAULT_FORMAT);
        String sDate = f.format(date);
        return sDate;
    }

    /**
     * @Description: 获取今年的第一天的日期
     * @Param: 无
     * @return: Date 今年的第一天
     * @Author: wangze
     */
    public static Date getCurrYearFirst(){
        Calendar currCal=Calendar.getInstance();
        int currentYear = currCal.get(Calendar.YEAR);
        return getYearFirst(currentYear);
    }

    /**
     * @Description: 获取今年的最后一天的日期
     * @Param: 无
     * @return: Date 今年的最后一天
     * @Author: wangze
     */
    public static Date getCurrYearLast(){
        Calendar currCal=Calendar.getInstance();
        int currentYear = currCal.get(Calendar.YEAR);
        return getYearLast(currentYear);
    }

    /**
     * @Description: 给定年份获取某年的第一天
     * @param year 年份
     * @return: 对应某年第一天的日期
     * @Author: wangze
     */
    public static Date getYearFirst(int year){
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, year);
        Date currYearFirst = calendar.getTime();
        return currYearFirst;
    }

    /**
     * @Description: 给定年份获取某年的最后一天
     * @param year 年份
     * @return: 对应某年最后一天的日期
     * @Author: wangze
     */
    public static Date getYearLast(int year){
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH,11);
        // 获取当前时间下，该月的最大日期的数字
        int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        // 将获取的最大日期数设置为Calendar实例的日期数
        calendar.set(Calendar.DAY_OF_MONTH, lastDay);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        Date currYearLast = calendar.getTime();
        return currYearLast;
    }

    /**
     * @Description: 给定年和月获取某月的第一天
     * @param year 年份
     * @param month 月份
     * @return: 对应某月的第一天
     * @Author: wangze
     */
    public static Date getFirstDay(int year, int month) {
        // 获取Calendar类的实例
        Calendar c = Calendar.getInstance();
        c.clear();
        // 设置年份
        c.set(Calendar.YEAR, year);
        // 设置月份，因为月份从0开始，所以用month - 1
        c.set(Calendar.MONTH, month - 1);
        // 设置日期
        c.set(Calendar.DAY_OF_MONTH, 1);
        return c.getTime();
    }

    /**
     * @Description: 给定年和月获取某月的最后一天
     * @param year 年份
     * @param month 月份
     * @return: 对应某月的最后一天
     * @Author: wangze
     */
    public static Date getLastDay(int year, int month) {
        // 获取Calendar类的实例
        Calendar c = Calendar.getInstance();
        c.clear();
        // 设置年份
        c.set(Calendar.YEAR, year);
        // 设置月份，因为月份从0开始，所以用month - 1
        c.set(Calendar.MONTH, month - 1);
        // 获取当前时间下，该月的最大日期的数字
        int lastDay = c.getActualMaximum(Calendar.DAY_OF_MONTH);
        // 将获取的最大日期数设置为Calendar实例的日期数
        c.set(Calendar.DAY_OF_MONTH, lastDay);
        c.set(Calendar.HOUR_OF_DAY, 23);
        c.set(Calendar.MINUTE, 59);
        c.set(Calendar.SECOND, 59);
        return c.getTime();
    }

    /**
     * @Description: 判断某个日期是否在指定的两个日期之间
     * @return: 判断结果
     * @Author: wangze
     */
    public static boolean isBetweenDates(Date d,Date d1,Date d2){
        if(d.after(d1)&&d.before(d2))
            return true;
        return false;
    }
}
